package com.define.ssh.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import com.define.ssh.util.PageSupport;

public interface BasicIDao {

	public void setSessionFactory(SessionFactory sessionFactory);

	public Session getSession();

	/**
	 * 保存对象 新增
	 * 
	 * @param entity
	 * 
	 */
	public void save(final Object entity);

	/**
	 * 新增或更新对象
	 * 
	 * @param entity
	 */
	public void saveOrupdate(final Object entity);

	/**
	 * 更新对象
	 * 
	 * @param entity
	 */
	public void update(final Object entity);

	/**
	 * 删除对象
	 * 
	 * @param entity
	 */
	public void delete(final Object entity);

	/**
	 * 根据ID获取对象
	 * 
	 * @param entity
	 * @param id
	 * @return 对象，或者未能发现符合条件的记录，返回null
	 */
	public <T> T get(final Class<T> clazz, final Serializable id);

	/**
	 * 返回所有对象的列表
	 * 
	 * @param entity
	 * @return
	 */
	public List findAll(final Class entity);

	/**
	 * 
	 * @param query
	 * @return list
	 */
	public List findByQuery(final String query);

	/**
	 * 
	 * @param query
	 * @param parameter
	 * @return list
	 */
	public List findByQuery(final String querySql, final Object parameter);

	/**
	 * @param query
	 * @param parameter
	 * @return
	 */
	public List findByQuery(final String querySql, final Object[] parameter);

	/**
	 * 创建Query
	 * 
	 * @param queryString
	 * @param values
	 * @return
	 */
	public Query createQuery(String queryString, Object[] values);

	/**
	 * sql语句查询
	 * 
	 * @param sql
	 * @return
	 */

	/**
	 * 创建SQLQuery
	 * 
	 * @param queryString
	 * @param values
	 * @return
	 */
	public SQLQuery createSQLQuery(String queryString, Object[] values);

	/**
	 * 执行sql返回map
	 * 
	 * @param queryString
	 * @param values
	 * @return
	 */
	public List<Map<Object, Object>> doSQLQuery(String queryString,
			Object... values);

	public List findBySqlQuery(final String sql);

	public Object getSqlObject(final String sql);

	/**
	 * sql语句分页查询
	 * 
	 * @param sql
	 * @param pageSize
	 * @param pageNo
	 * @return
	 */
	public List findBySqlQueryOnPage(final String sql, final int pageSize,
			final int pageNo);

	/**
	 * 
	 * 查询指定数量的对象 带分页条件
	 * 
	 * @param query
	 * @param parameter
	 * @return
	 */
	public List findObjectListByPage(final String hql,
			final Object[] parameter, final int pageNo, final int pageSize);

	/**
	 * 
	 * 查询满足条件的数量
	 * 
	 * @param query
	 * @param parameter
	 * @return
	 */
	public int findCountByCondition(final String hql, final Object[] parameter);

	/**
	 * 
	 * 查询指定数量的对象
	 * 
	 * @param query
	 * @param parameter
	 * @return
	 */
	public List findNumList(final String query, final int resultcount);

	/**
	 * 返回符合条件的记录列表
	 * 
	 * @param dc
	 * @return list
	 */
	public List findByCriteria(final DetachedCriteria dc);

	/**
	 * 搜索指定数量的数据
	 * 
	 * @param dc
	 * @param count
	 * @return
	 */
	public List findByCriteria(final DetachedCriteria dc, final int count);

	/**
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public int execute(final String hql, final Object[] values);

	/**
	 * 执行hql 更新,删除 操作
	 * 
	 * @param hql
	 * @return int
	 */
	public int execute(final String hql);

	/**
	 * 执行hql 更新,删除 操作
	 * 
	 * @param hql
	 * @return int
	 */
	public int executeSql(final String sql, final Object[] values);

	/**
	 * 执行sql 更新,删除 操作
	 * 
	 * @param sql
	 * @return
	 */
	public int executeSql(final String sql);

	/**
	 * 仅支持以 select count(*) from ... *
	 * 
	 * @param sql
	 * @return
	 * @author agu
	 */
	public long findCountBySql(final String sql);

	/**
	 * hql
	 * 
	 * @param hql
	 * @return
	 */
	public int findCountByQuery(final String hql);

	/**
	 * 分页查询
	 * 
	 * @param dc
	 * @param pageSize
	 * @param pageNo
	 *            从1开始的页数
	 * @return PaginationSupport
	 * @throws ServiceException
	 */
	public PageSupport findPageOnPageNo(final DetachedCriteria dc,
			final int pageSize, final int pageNo);

	/**
	 * 分页查询
	 * 
	 * @param dc
	 *            条件
	 * @param page
	 *            页面信息 包含 maxperpage pagenumber 等
	 */

	public PageSupport findPageOnPageNo(final DetachedCriteria dc,
			final PageSupport page);

	/**
	 * 返回符合条件的记录数量
	 * 
	 * @param dc
	 * @return int
	 */
	public int getCountByCriteria(final DetachedCriteria dc);

	/**
	 * 
	 * @param sql
	 * @param c
	 * @param pageSize
	 * @param pageNo
	 * @return
	 */
	public List findBySqlEntity(final String sql, final Class c,
			final int pageSize, final int pageNo);
}